package com.woniuxy.service.impl;

import com.woniuxy.entity.Address;
import com.woniuxy.entity.Cart;
import com.woniuxy.entity.Order;
import com.woniuxy.entity.OrderItem;
import com.woniuxy.entity.vo.OrderVO;
import com.woniuxy.entity.vo.PayVO;
import com.woniuxy.exception.AddOrderException;
import com.woniuxy.exception.AddOrderItemException;
import com.woniuxy.exception.DeleteCartException;
import com.woniuxy.mapper.OrderMapper;
import com.woniuxy.service.*;
import com.woniuxy.utils.ResponseResults;
import com.woniuxy.utils.ResponseState;
import com.woniuxy.utils.SnowflakeIdWorker;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;

@Service
public class OrderServiceImpl implements OrderService {

    /**
     * service：事务处理、业务处理
     * 调用其他模块的业务代码，注入service
     * 直接注入mapper，会错过service中的业务代码，可能导致报错，因此注入service
     * */

    @Resource
    private CartService cartService;

    @Resource
    private GoodsService goodsService;

    @Resource
    private AddressService addressService;

    @Resource
    private OrderItemService orderItemService;

    @Resource
    private OrderMapper orderMapper;


    @Transactional
    @Override
    public ResponseResults<PayVO> add(OrderVO orderVO, int uid) {

        /** 1. 查询库存是否足够，足够就减库存 */

        // 1.1 根据购物车id查询购物车信息（商品id、数量）
        List<Cart> cartList = cartService.findByIds(orderVO.getIds());

        // 1.2 TODO 遍历list，比较cart.num与cart.goods.stock  得到库存是否足够

        // 1.3 如果库存足够，删减库存   通过商品id作为条件删减库存（stock-cart.num）
        AtomicReference<BigDecimal> total = new AtomicReference<>(new BigDecimal("0"));
        cartList.forEach(cart -> {
            int i = goodsService.subStock(cart.getGoods().getId(), cart.getNum());
            if (i == 0){
                throw new RuntimeException("删减库存失败");
            }
            // 小计
            BigDecimal small = new BigDecimal("0");
            // 数量
            BigDecimal num = new BigDecimal(cart.getNum());
            // 得到小计
            small= num.multiply(cart.getGoods().getPrice());
            // 累加
            total.set(total.get().add(small));
        });
        // 执行到此处说明库存删减成功

        /** 2. 向订单表中插入订单信息 */
        // 2.1 使用雪花算法生成订单id
        String orderno =new SnowflakeIdWorker(1).nextId()+"";

        // 2.2 得到总价
        BigDecimal totalprice=total.get();
        System.out.println("总价："+totalprice.doubleValue());

        // 2.3 得到收货人地址信息，通过地址id查询地址信息
        Address address = addressService.findAddressById(orderVO.getAid());
        System.out.println("aid："+ orderVO.getAid());
        System.out.println("address："+ address);

        // 2.4.将所有的数据封装为实体类对象
        Order order = new Order();
        order.setOrderno(orderno);
        order.setUid(uid);
        order.setTotalprice(totalprice);
        order.setAddress(address.getProvinces()+address.getCity()+address.getCounty()+address.getDetailaddress());
        order.setAccept(address.getAccept());
        order.setTelphone(address.getTelphone());

        // 2.5.向订单表中插入订单信息
        if (!orderMapper.add(order)){
            throw new AddOrderException("添加订单失败");
        }

        /** 3. 向订单详情表中插入商品信息  前提是能得到上一步生成的订单id*/

        // 3.1 将所有的数据封装为实体类对象
        List<OrderItem> list = new ArrayList<>();

        // 3.2. 组装：遍历，将信息存入orderItem，再将orderItem存入List
        for (Cart cart: cartList){
            OrderItem orderItem = new OrderItem();
            orderItem.setOid(order.getId());
            orderItem.setGid(cart.getGid());
            orderItem.setGname(cart.getGoods().getName());
            orderItem.setImage(cart.getGoods().getImage());
            orderItem.setPrice(cart.getGoods().getPrice());
            orderItem.setNum(cart.getNum());
            orderItem.setState("0");
            // 存入list
            list.add(orderItem);
        }

        // 3.3.向订单详情表中插入订单信息
        // 比较list中的对象数量
        if (orderItemService.add(list) < list.size()){
            throw new AddOrderItemException("添加订单详情异常");
        }

        /** 4. 批量删除购物车信息 */
        int i = cartService.delCartByIds(orderVO.getIds());
        System.out.println("i:"+i);
        if (i !=  orderVO.getIds().length){
            throw new DeleteCartException("删除购物车异常");
        }

        /** 5. 封装结果 返回给前端，并将封装好的新数据发送给新的页面 */
        PayVO payVO = new PayVO();
        payVO.setOrderno(orderno);
        payVO.setOrdername(UUID.randomUUID().toString());
        payVO.setPrice(totalprice);
        payVO.setDescription("蜗牛商城订单");

        return new ResponseResults<PayVO>()
                .setCode(200)
                .setState(ResponseState.ADD_SUCCESS)
                .setMsg("下单成功")
                .setData(payVO);
    }
}
